#include<iostream>
#include<vector>
#include<functional>
#include<signal.h>
#include<unistd.h>
int g_count = 0;
using func_t = std::function<void()>;
std::vector<func_t> g_funcs;


void PrintPending(const sigset_t& pending)
{
    std::cout<<"current pending list: "<<getpid()<<std::endl;
    for(int signo = 31;signo >= 1;signo--){
        if(sigismember(&pending,signo)){
            std::cout<<1;
        }
        else{
            std::cout<<0;
        }
    }
    std::cout<<std::endl;
}
int main()
{
    sigset_t old_block, new_block;//用户栈
    ::sigemptyset(&old_block);//初始化信号集
    ::sigemptyset(&new_block);//初始化信号集
    ::sigaddset(&new_block,2);//将2号信号加入到信号集
    //将用户栈上的位图设置进内核中
    ::sigprocmask(SIG_SETMASK,&new_block,&old_block);//将2号信号加入到阻塞信号集（内核）
    
    //获取pending表
    int cnt = 10;
    ::signal(2,SIG_IGN);//忽略2号信号
    while(true){
        sigset_t pending;
        ::sigpending(&pending);//获取pending表
        PrintPending(pending);
        ::sleep(1);
        if(cnt==0){
            std::cout<<"恢复原来的阻塞信号集"<<std::endl;
            ::sigprocmask(SIG_SETMASK,&old_block,nullptr);//恢复原来的阻塞信号集

        }
        cnt--;
    }
    return 0;
}


// void handle(int sig)
// {
//     std::cout<<"receive signal "<<sig<<std::endl;   

// }
// int main()
// {
//     //::signal(SIGINT,SIG_IGN);//忽略捕捉SIGINT信号(IGN:ignore)
//     ::signal(SIGINT,SIG_DFL);//设置默认信号处理函数(DFL:default)
//     while(true){
//         pause(); //阻塞进程，直到收到信号
//     }
//     return 0;
// }
// void handle(int sig)
// {
//     std::cout<<"receive signal "<<sig<<std::endl;
//     for(auto& f : g_funcs){
//         f();
//     }
//     std::cout<<"g_count="<<g_count<<std::endl; 
//     ::alarm(1); //设置闹钟时间为1秒
//     // ::exit(0);
// }
// int main()
// {
//     ::signal(SIGALRM,handle);//设置闹钟信号处理函数
    
//     g_funcs.push_back([](){
//         std::cout<<"Dowonload ..."<<std::endl;
//     });
//     g_funcs.push_back([](){
//         std::cout<<"Sql ..."<<std::endl;
//     }); 
//     g_funcs.push_back([](){
//         std::cout<<"Send Email ..."<<std::endl;
//     });
//     ::alarm(1); //设置闹钟时间为1秒

//     //main执行流一直在跑
//     while(true){
//         ::pause(); //阻塞进程，直到收到信号
//         std::cout<<"main process receive signal"<<std::endl;
//         g_count++;
//     }
//     return 0;
// }


// void hanle(int sig)
// {   
//     std::cout<<"receive signal "<<sig<<std::endl;
//     ::exit(0);
// }
// int cnt = 0;
// int main()
// {
//     ::signal(SIGALRM,hanle);//设置闹钟信号处理函数
//     // ::alarm(1); //设置闹钟时间为1秒
//     // while(1){
//     //     cnt++;
//     //     std::cout<<"cnt="<<cnt<<std::endl;
//     // }
//     ::alarm(10); //设置闹钟时间为10秒
//     ::sleep(4); //休眠4秒
//     unsigned int t = ::alarm(0);//取消闹钟
//     std::cout<<"取消后原闹钟剩余时间为 "<<t<<std::endl;

//     return 0;
// }